import { Projection, ProjectionLike } from 'ol/proj'
import { Coordinate } from 'ol/coordinate'
import BaseLayer from 'ol/layer/Base'
import { Collection } from 'ol'
import LayerGroup from 'ol/layer/Group'
import Style from 'ol/style/Style'
import { TileGrid } from 'ol/tilegrid'
import { Size } from 'ol/size'

export interface InitMapOptions {
  /** 坐标系 */
  projection?: ProjectionLike
  /** 默认中心点 */
  center?: Coordinate | undefined
  /** 默认层级 */
  zoom?: number | undefined
  /** 最小缩放限制 */
  minZoom?: number
  /** 最大缩放限制 */
  maxZoom?: number
  /** 设置该参数为true来让每次缩放结束后自动缩放到距离最近的一个整数级别 */
  constrainResolution?: boolean
  /** 设置是否允许旋转 */
  enableRotation?: boolean
  /** 图层组 */
  layers?: Array<BaseLayer> | Collection<BaseLayer> | LayerGroup | undefined
  /** 双击放大地图 */
  doubleClickZoom?: boolean
}

export interface PointLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
  /** 是否聚合 */
  cluster?: boolean
  /** 聚合像素范围 */
  distance?: number
  /** 聚合样式 */
  clusterStyle?: Style
}

export interface PictureMarkerLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
  /** 是否聚合 */
  cluster?: boolean
  /** 聚合像素范围 */
  distance?: number
  /** 聚合样式 */
  clusterStyle?: Style
  /** 聚合文字Y方向偏移量 */
  textOffsetY?: number
}

export interface TextMarkerLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
  /** 需要显示的字段名称 */
  showTextKey?: string
}

export interface LineLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
}

export interface PolygonLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
}

export interface GeojsonLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
}

export interface HeatMapLayerOptions {
  /** 样式 */
  style?: Style
  /** 默认是否显示 */
  visible?: boolean
  /** 热力值字段名称 */
  cntStr?: string
  /** 热点半径 */
  radius?: number
  /** 模糊尺寸 */
  blur?: number
}

export interface XYZLayerOptions {
  /** 图层id */
  id?: string
  /** 默认是否显示 */
  visible?: boolean
  /** 服务url */
  url: string
  /** 坐标系 */
  projection?: ProjectionLike
  /** 切片方案 */
  tileGrid?: TileGrid | undefined,
  /** 跨域设置 */
  crossOrigin?: string | null | undefined,
}

export interface VectorTileLayerOptions {
  /** 图层id */
  id?: string
  /** 默认是否显示 */
  visible?: boolean
  /** 服务url */
  url: string
  /** 坐标系 */
  projection?: Projection
  /** 分辨率 */
  resolutions: Array<number>
  /** 矩阵ID。此数组的长度需要与分辨率数组的长度相匹配。 */
  matrixIds: Array<string>
  /** 切片大小 */
  tileSize: number | Size | undefined
}

export interface WMTSLayerOptions {
  /** 图层id */
  id?: string
  /** 默认是否显示 */
  visible?: boolean
  /** 服务url */
  url: string
  /** 坐标系 */
  projection?: Projection
  /** 分辨率 */
  resolutions: Array<number>
  /** 矩阵ID。此数组的长度需要与分辨率数组的长度相匹配。 */
  matrixIds: Array<string>
  /** 投影坐标系矩阵集 */
  matrixSet: string
  /** 需要加载的图层id */
  layer?: string
  /** WMTS版本 */
  version?: string
  /** Style name as advertised in the WMTS capabilities. */
  style?: string
  /** 图像格式,仅在请求编码为"KVP"时使用 */
  format?: string
  /** 跨域设置 */
  crossOrigin?: string | null | undefined,
}

export interface ResolutionsAndMids {
  /** 分辨率数组 */
  resolutions: Array<number>
  /** 矩阵ID。此数组的长度需要与分辨率数组的长度相匹配。 */
  matrixIds: Array<string>
}

export interface GoToLayerOptions {
  /** 定位所需时间(毫秒) */
  duration?: number
  /** 定位完毕回调函数 */
  callback?: () => void
}

export interface CenterAndZoomOptions {
  /** 中心点 */
  center: Coordinate
  /** 定位层级 */
  zoom: number
  /** 定位所需时间(毫秒) */
  duration?: number
  /** 定位完毕回调函数 */
  callback?: () => void
}

export interface goToFeatureOptions {
  /** 定位所需时间(毫秒) */
  duration?: number
  /** 定位完毕回调函数 */
  callback?: () => void
}

export interface FlyLineOptions {
  /** 包含飞线图canvas的dom */
  parentDom: HTMLElement
  /** 定位完毕回调函数 */
  callback?: (param: any) => void
}

export interface checkLongitudeAndLatitudeOptions {
  /** 代表经度的字段 */
  longitudeStr: string
  /** 代表纬度的字段 */
  latitudeStr: string
}
